iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Web 3

NFT、區塊鏈、比特幣,這些到底是什麼?? 讓我們從頭認識這些酷東西吧! 發出屬於自己的NFT!系列 第 20

[Day 20] 從BAYC猴子的智能合約 看懂背後運作原理(二)ERC721標準與OpenZeppelin

  • 分享至 

  • xImage
  •  

上篇回顧

上偏我們簡單介紹到了如何使用Etherscan來瀏覽以太坊上所有的交易紀錄與錢包地址,以及上傳智能合約時編譯與驗證的小知識。今天就讓我們繼續以BAYC的合約來進行研究認識吧!


先認識ERC-721標準

在我們正式開始研究BAYC的合約前,我們並須先弄懂以太坊基金會所規定的代幣標準,這邊就直接以ERC721為例!也就是大家最常用來發行NFT的標準。
首先直接進入ERC721代幣標準的官方說明頁面,我們可以看到文件中提到,ERC-721標準是在2018年一月正式上架的,並提到若要符合該標準,必須擁有像是把此代幣傳送至另一個錢包、得到某個錢包的餘額、查看其中某個代幣的持有者以及設定此代幣的總數等函式...
https://ithelp.ithome.com.tw/upload/images/20221002/20152537ieBLvZNu6x.png
詳細需要的Methods以及Events如下:

    function balanceOf(address _owner) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function approve(address _approved, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);

    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

若此代幣符合以上標準,也就是擁有上面規定的Methods函式Events事件,則可以被歸類成ERC-721的代幣。

回到BAYC的合約

讓我們回到BAYC的合約吧! 大家先粗略的翻閱一下
https://ithelp.ithome.com.tw/upload/images/20221002/20152537xb03ZKwdh7.png
總共2021行的程式碼好像有點多 這其中有什麼祕密嗎?
其實有,大家有發現嗎? 整個程式碼似乎是由很多個區組成起來的欸! 而且前面一定都會先有註解語法File: @openzeppelin/..,然後銜接pragma solidity >=0.x.0;,這些到底是什麼意思啊??https://ithelp.ithome.com.tw/upload/images/20221002/20152537lSf1mmLXLQ.png

猜到了嗎?,其實pragma solidity >=0.6.0 <0.8.0代表著Solidity語言的版本號,而0.6.0 <0.8.0就代表著大家在編譯輸出的時候必須用0.6.0~0.8.0的版本跑才不會出問題。而開頭註解提到的File: @openzeppelin/..其時就是在表明這段code是引用別人的,透過註解表明出處並直接複製貼上使用。https://ithelp.ithome.com.tw/upload/images/20221002/201525370muqy8FuVf.png

不過這樣算下來...,好像從第1895行後才是自己寫的欸,前面都是直接引用他人寫好的Library做使用,這個Openzeppelin到底是何方神聖阿? 怎麼都引用他的函式庫呢?

OpenZeppelin

前面有提到以太坊基金會對於代幣模型是有一套標準的,像ERC-20、ERC-721、ERC-1155...等,都需要有特定的函式才會被認可,而這些函式像查看對方的錢包餘額、轉代幣給對方等,都非常的基礎但又重要,哪怕是有一點打錯都可能造成安全性上的問題。用個簡單的數學例子比喻: 假設以太坊基金會規定新的ERC-123代幣,都必須擁有"平方"函式才算合格,而其中"平方"這個函式大家要怎麼處理、運算則會有各自不同的解。而這時候就是OpenZeppelin出場的時候了,透過開源及所有人都可以共同維護的方式,提供了各種代幣標準所需的函式,並具備了持續更新、安全、快速的特性。這樣對於合約作者來說節省了開發時間,對於閱讀者也節省了驗證正確性的時間,可以達到快速信任的效果,可以說是雙贏。關於怎麼使用這個Library,未來開發的時候我們在詳細介紹!https://ithelp.ithome.com.tw/upload/images/20221003/20152537qYTdcAijcu.png
(OpenZeppelin快速開發頁面,除了提供代幣標準的函式,更提供了常見的NFT函式)

--

小結

今天跟大家介紹了ERC721標準以及OpenZeppelin強大的Library,其實BAYC猴子的合約有90%都是引用別人的函式庫而已喔!明天讓我們真正來開始看合約吧!

<上一篇> [Day 19] 從BAYC猴子的智能合約 看懂背後運作原理(一)Etherscan
<下一篇> [Day 21] 從BAYC猴子的智能合約 看懂背後運作原理(三)其實BAYC的合約有漏洞!


參考資料:


上一篇
[Day 19] 從BAYC猴子的智能合約 看懂背後運作原理(一)Etherscan
下一篇
[Day 21] 從BAYC猴子的智能合約 看懂背後運作原理(三)其實BAYC的合約有漏洞!
系列文
NFT、區塊鏈、比特幣,這些到底是什麼?? 讓我們從頭認識這些酷東西吧! 發出屬於自己的NFT!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言